/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package szachy;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Robert
 */
public class Krol extends Figura implements Serializable{
    private static final long serialVersionUID = 1L;

    public boolean tabZagrozen[][];

    public Krol() {
    }

    public Krol(char kolor, String nazwa, String rodzaj) {
        this.kolor = kolor;
        if(kolor=='j'){
            krolX=7;
        }
        else{
            krolX=0;
        }
        krolY=4;
        iloscRuchu = 1;
        this.nazwa = nazwa;
        this.rodzaj = rodzaj;
        tabZagrozen = new boolean[8][8];
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                tabZagrozen[i][j] = false;
            }
        }
        skadSzach = new int[5][2];
        czySzach = false;
        kolorKrola=this.kolor;
    }

    public void WyczyscTablice() {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                tabZagrozen[i][j] = false;
            }
        }
    }

    public void uzupelnijTablice(IGra g) throws RemoteException {
        czySzach = false;
        iloscSzachow = -1;
        WyczyscTablice();
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (g.CzyZajete(i, j)) {
                    if(krolX==i && krolY==j) continue; //miejsce na którym stoi król
                    tabZagrozen[i][j] = true;
                    String figura;
                    figura = g.ZwrocFigure(i, j).CoTo();
                    char kolor = g.ZwrocFigure(i, j).PobierzKolor();
                    if (figura.equals("pion") && kolorKrola != kolor) { //pion
                        if (kolor == 'j') {//biały
                            if (i - 1 >= 0 && j - 1 >= 0)//zabezpieczenie by nie przekroczyć rozmiaru
                            {
                                tabZagrozen[i - 1][j - 1] = true;
                                spradzSzach(i - 1, j - 1, krolX, krolY, i, j);
                            }
                            if (i + 1 < 8 && j - 1 >= 0)//zabezpieczenie by nie przekroczyć rozmiaru
                            {
                                tabZagrozen[i + 1][j - 1] = true;
                                spradzSzach(i + 1, j - 1, krolX, krolY, i, j);
                            }
                        } else {
                            if (i - 1 >= 0 && j + 1 < 8)//zabezpieczenie by nie przekroczyć rozmiaru
                            {
                                tabZagrozen[i - 1][j + 1] = true;
                                spradzSzach(i - 1, j + 1, krolX, krolY, i, j);
                            }
                            if (i + 1 < 8 && j + 1 < 8)//zabezpieczenie by nie przekroczyć rozmiaru
                            {
                                tabZagrozen[i + 1][j + 1] = true;
                                spradzSzach(i + 1, j + 1, krolX, krolY, i, j);
                            }
                        }
                    } else if (figura.equals("skoczek") && kolorKrola != kolor) {
                        if (i - 2 >= 0 && j - 1 >= 0) {
                            tabZagrozen[i - 2][j - 1] = true;
                            spradzSzach(i - 2, j - 1, krolX, krolY, i, j);
                        }
                        if (i - 1 >= 0 && j - 2 >= 0) {
                            tabZagrozen[i - 1][j - 2] = true;
                            spradzSzach(i - 1, j - 2, krolX, krolY, i, j);
                        }
                        if (i + 1 < 8 && j - 2 >= 0) {
                            tabZagrozen[i + 1][j - 2] = true;
                            spradzSzach(i + 1, j - 2, krolX, krolY, i, j);
                        }
                        if (i + 2 < 8 && j - 1 >= 0) {
                            tabZagrozen[i + 2][j - 1] = true;
                            spradzSzach(i + 2, j - 1, krolX, krolY, i, j);
                        }
                        if (i - 2 >= 0 && j + 1 < 8) {
                            tabZagrozen[i - 2][j + 1] = true;
                            spradzSzach(i - 2, j + 1, krolX, krolY, i, j);
                        }
                        if (i - 1 >= 0 && j + 2 < 8) {
                            tabZagrozen[i - 1][j + 2] = true;
                            spradzSzach(i - 1, j + 2, krolX, krolY, i, j);
                        }
                        if (i + 1 < 8 && j + 2 < 8) {
                            tabZagrozen[i + 1][j + 2] = true;
                            spradzSzach(i + 1, j + 2, krolX, krolY, i, j);
                        }
                        if (i + 2 < 8 && j + 1 < 8) {
                            tabZagrozen[i + 2][j + 1] = true;
                            spradzSzach(i + 2, j + 1, krolX, krolY, i, j);
                        }
                    } else if (figura.equals("wieza") && kolorKrola != kolor) {
                        int k = i - 1;//najpierw w stronę zachodu
                        while (k >= 0 && (!g.CzyZajete(k, j) || g.ZwrocFigure(j, k).CoTo().equals("krol"))) {
                            tabZagrozen[k][j] = true;
                            spradzSzach(k, j, krolX, krolY, i, j);
                            k--;
                        }
                        k = i + 1;//teraz w stonę wschodu
                        while (k < 8 && (!g.CzyZajete(k, j) || g.ZwrocFigure(j, k).CoTo().equals("krol"))) {
                            tabZagrozen[k][j] = true;
                            spradzSzach(k, j, krolX, krolY, i, j);
                            k++;
                        }
                        k = j - 1;//północ
                        while (k >= 0 && (!g.CzyZajete(i, k) || g.ZwrocFigure(i, k).CoTo().equals("krol"))) {
                            tabZagrozen[i][k] = true;
                            spradzSzach(i, k, krolX, krolY, i, j);
                            k--;
                        }
                        k = j + 1;//północ
                        while (k <8 && (!g.CzyZajete(i, k) || g.ZwrocFigure(i, k).CoTo().equals("krol"))) {
                            tabZagrozen[i][k] = true;
                            spradzSzach(i, k, krolX, krolY, i, j);
                            k++;
                        }
                    } else if (figura.equals("goniec") && kolorKrola != kolor) {
                        //prawy górny róg
                        int k = i + 1;
                        int l = j - 1;
                        while (k < 8 && l >= 0 && (!g.CzyZajete(k, l) || g.ZwrocFigure(k, l).CoTo().equals("krol"))) {
                            tabZagrozen[k][l] = true;
                            spradzSzach(k, l, krolX, krolY, i, j);
                            k++;
                            l--;
                        }
                        //prawy dolny róg
                        k = i + 1;
                        l = j + 1;
                        while (k < 8 && l < 8 && (!g.CzyZajete(k, l) || g.ZwrocFigure(k, l).CoTo().equals("krol"))) {
                            tabZagrozen[k][l] = true;
                            spradzSzach(k, l, krolX, krolY, i, j);
                            k++;
                            l++;
                        }
                        //lewy dolny róg
                        k = i - 1;
                        l = j + 1;
                        while (k >= 0 && l < 8 && (!g.CzyZajete(k, l) || g.ZwrocFigure(k, l).CoTo().equals("krol"))) {
                            tabZagrozen[k][l] = true;
                            spradzSzach(k, l, krolX, krolY, i, j);
                            k--;
                            l++;
                        }
                        //lewy górny róg
                        k = i - 1;
                        l = j - 1;
                        while (k >= 0 && l >= 8 && (!g.CzyZajete(k, l) || g.ZwrocFigure(k, l).CoTo().equals("krol"))) {
                            tabZagrozen[k][l] = true;
                            spradzSzach(k, l, krolX, krolY, i, j);
                            k--;
                            l--;
                        }
                    } else if (figura.equals("hetman") && kolorKrola != kolor) {
                        //wieża i goniec razem...
                        int k = i - 1;//najpierw w stronę zachodu
                        while (k >= 0 && (!g.CzyZajete(k, j) || g.ZwrocFigure(k, j).CoTo().equals("krol"))) {
                            tabZagrozen[k][j] = true;
                            spradzSzach(k, j, krolX, krolY, i, j);
                            k--;
                        }
                        k = i + 1;//teraz w stonę wschodu
                        while (k < 8 && (!g.CzyZajete(k, j) || g.ZwrocFigure(k, j).CoTo().equals("krol"))) {
                            tabZagrozen[k][j] = true;
                            spradzSzach(k, j, krolX, krolY, i, j);
                            k++;
                        }
                        k = j - 1;//północ
                        while (k >= 0 && (!g.CzyZajete(i, k) || g.ZwrocFigure(i, k).CoTo().equals("krol"))) {
                            tabZagrozen[i][k] = true;
                            spradzSzach(i, k, krolX, krolY, i, j);
                            k--;
                        }
                        k = j + 1;//północ
                        while (k <8 && (!g.CzyZajete(i, k) || g.ZwrocFigure(i, k).CoTo().equals("krol"))) {
                            tabZagrozen[i][k] = true;
                            spradzSzach(i, k, krolX, krolY, i, j);
                            k++;
                        }//część gońca
                        //lewy dolny róg
                        k = i + 1;
                        int l = j - 1;
                        while (k < 8 && l >= 0 && (!g.CzyZajete(k, l) || g.ZwrocFigure(k, l).CoTo().equals("krol"))) {
                            tabZagrozen[k][l] = true;
                            spradzSzach(k, l, krolX, krolY, i, j);
                            k++;
                            l--;
                        }
                        //prawy dolny róg
                        k = i + 1;
                        l = j + 1;
                        while (k < 8 && l < 8 && (!g.CzyZajete(k, l) || g.ZwrocFigure(k, l).CoTo().equals("krol"))) {
                            tabZagrozen[k][l] = true;
                            spradzSzach(k, l, krolX, krolY, i, j);
                            k++;
                            l++;
                        }
                        //prawy górny róg
                        k = i - 1;
                        l = j + 1;
                        while (k >= 0 && l < 8 && (!g.CzyZajete(k, l) || g.ZwrocFigure(k, l).CoTo().equals("krol"))) {
                            tabZagrozen[k][l] = true;
                            spradzSzach(k, l, krolX, krolY, i, j);
                            k--;
                            l++;
                        }
                        //lewy górny róg
                        k = i - 1;
                        l = j - 1;
                        while (k >= 0 && l >= 8 && (!g.CzyZajete(k, l) || g.ZwrocFigure(k, l).CoTo().equals("krol"))) {
                            tabZagrozen[k][l] = true;
                            spradzSzach(k, l, krolX, krolY, i, j);
                            k--;
                            l--;
                        }
                    } else if (figura.equals("krol") && kolorKrola != kolor) {
                        if (i - 1 >= 0 && j - 1 >= 0) {
                            tabZagrozen[i - 1][j - 1] = true;
                            spradzSzach(i-1, j-1, krolX, krolY, i, j);
                        }
                        if (j - 1 >= 0) {
                            tabZagrozen[i][j - 1] = true;
                            spradzSzach(i, j-1, krolX, krolY, i, j);
                        }
                        if (i + 1 < 8 && j - 1 >= 0) {
                            tabZagrozen[i + 1][j - 1] = true;
                            spradzSzach(i+1, j-1, krolX, krolY, i, j);
                        }
                        if (i + 1 < 8) {
                            tabZagrozen[i + 1][j] = true;
                            spradzSzach(i+1, j, krolX, krolY, i, j);
                        }
                        if (i + 1 < 8 && j + 1 < 8) {
                            tabZagrozen[i + 1][j + 1] = true;
                            spradzSzach(i+1, j+1, krolX, krolY, i, j);
                        }
                        if (j + 1 < 8) {
                            tabZagrozen[i][j + 1] = true;
                            spradzSzach(i-1, j+1, krolX, krolY, i, j);
                        }
                        if (i - 1 >= 0 && j + 1 < 8) {
                            tabZagrozen[i - 1][j + 1] = true;
                            spradzSzach(i-1, j+1, krolX, krolY, i, j);
                        }
                        if (i - 1 >= 0) {
                            tabZagrozen[i - 1][j] = true;
                            spradzSzach(i-1, j, krolX, krolY, i, j);
                        }
                    }
                }
            }
        }
        tabZagrozen[krolX][krolY] = false;
    }

    public boolean sprawdzMat() {
        int poczX, konX, poczY, konY;
        //ograniczenie przeszukiwania żeby nie wyjśc poza tablicę
        if (krolX > 0) {
            poczX = krolX - 1;
        } else {
            poczX = 0;
        }
        if (krolX == 7) {
            konX = 7;
        } else {
            konX = krolX + 1;
        }
        if (krolY > 0) {
            poczY = krolY - 1;
        } else {
            poczY = 0;
        }
        if (krolY == 7) {
            konY = 7;
        } else {
            konY = krolY + 1;
        }
        for (int i = poczX; i < konX; i++) {
            for (int j = poczY; j < konY; j++) {
                if (krolX == i && krolY == j) {
                    continue; //miejsce w którym stoi król
                }
                if (!tabZagrozen[i][j]) {
                    return false; //jeśli jest choć jeden możliwy ruch
                }
            }
        }
        //trzeba dodać możliwość blokowania
        return true;
    }

    public void spradzSzach(int x, int y, int krolX, int krolY, int pozX, int pozY) {
        if (x == krolX && y == krolY) { //sprawdzenie czy jest szach króla
            czySzach = true;
            iloscSzachow++;
            skadSzach[iloscSzachow][0] = pozX;
            skadSzach[iloscSzachow][1] = pozY;
        }
    }

    public boolean czySzach(IGra g) throws RemoteException {
        uzupelnijTablice(g);
        return czySzach;
    }

    public boolean mozliwyRuch(int fromX, int fromY, int toX, int toY, IGra g){
        try {
            uzupelnijTablice(g);
        } catch (RemoteException ex) {
            Logger.getLogger(Krol.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (Math.abs(fromX - toX) > 1 || Math.abs(fromY - toY) > 1) {
            return false; //jeśli ruch jest dłuższy od 1
        }
        if (tabZagrozen[toX][toY] == true) {
            return false; //jeśli miejsce jest szachowane
        }
        krolX=toX;
        krolY=toY;
        return true;
    }

    public boolean mozliwoscBicia(int fromX, int fromY, int toX, int toY, IGra g) {
        try {
            if (g.ZwrocFigure(toX, toY).CoTo().equals("krol")) {
                return false;
            }
        } catch (RemoteException ex) {
            Logger.getLogger(Pion.class.getName()).log(Level.SEVERE, null, ex);
        }
        int tmpX,tmpY;
        tmpX=krolX;
        tmpY=krolY;
        krolX=toX;
        krolY=toY;
        try {
            g.UstalZajetosc(krolX, krolX,false); //po przesunieciu miejsce jest chwilowo puste
            uzupelnijTablice(g);
            g.UstalZajetosc(krolX, krolX,true);
            
        } catch (RemoteException ex) {
            Logger.getLogger(Krol.class.getName()).log(Level.SEVERE, null, ex);
        }
        if(!czySzach) return true; //jeśli nic nie szachuje nowego miejsca wykonujemy ruch
        //w przeciwnym razie przywracamy współrzędne
        krolX=tmpX;
        krolY=tmpY;
        return false;
    }
    int skadSzach[][];
    boolean czySzach;
    int iloscSzachow;
    char kolorKrola;
    int krolX,krolY;
}
